package com.doyoulike.service.template;

import com.doyoulike.config.gen.FreeMarkers;
import com.doyoulike.config.gen.GenTemplate;
import com.doyoulike.vo.out.GenData;
import com.doyoulike.vo.out.GeneratedContent;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 模板引擎服务
 */
@Service
public class FreeMarkersService implements ITemplateEngineService{

    /**
     * 获取最终需要的文件内容（文件名、文件路径、文件内容）
     * 获取最终需要的文件内容，去除一些不必要的信息，保留最简洁，真正需要的东西
     * @param basePath  文件路径
     * @param genData   生成数据
     * @param templates 模板列表
     */
    @Override
    public List<GeneratedContent> resolveTemplateContent(String basePath, GenData genData, List<GenTemplate> templates) {
        List<GeneratedContent> contentList = new ArrayList<>();
        for (GenTemplate template : templates) {
            // 1.获取文件生成位置
            String filePath = resolveFileTargetPath(basePath, genData, template);

            // 2.获取文件生成的内容
            String content = resolveFileName(genData, StringUtils.trimToEmpty(template.getContent()));

            // 3. 保存文件内容
            contentList.add(new GeneratedContent(filePath, content));
        }
        return contentList;
    }

    /**
     * 组装文件生成的完整路径
     */
    private static String resolveFileTargetPath(String basePath, GenData genData, GenTemplate template) {

        // 一、从模板中获取生成路径（文件夹路径）
        String folderPath = resolveFolder(genData, template);

        // 二、获取文件名（获取定义在模板中的文件名格式，渲染出真实文件名）
        String fileName = resolveFileName(genData, template.getFileName());

        // 三、组装完整的生成路径（项目路径 + 文件夹路径 + 文件名）
        String result = basePath + File.separator + folderPath + fileName;

        // 四、返回结果
        return result;
    }

    /**
     * 解析模板中定义的文件生成目录
     */
    private static String resolveFolder(GenData genData, GenTemplate template) {
        // 一、获取文件夹路径（根据定义在模板中的生成路径，渲染出真实路径）
        String folderPath = resolveFileName(genData, template.getFilePath() + "/");

        // 二、将 folderPath 的路径分隔符替换成当前操作系统的分隔符（例如将 “//、/、.” 替换成 File.separator 生成的分隔符）
        folderPath = StringUtils.replaceEach(folderPath, new String[]{"//", "/", "."}, new String[]{File.separator, File.separator, File.separator});

        // 三、返回路径
        return folderPath;
    }

    /**
     * 解析文件名
     */
    private static String resolveFileName(GenData genData, String fileName) {
        return FreeMarkers.renderString(fileName, genData);
    }

}
